package cc.comac.mom.datahandlers.entity;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import cc.comac.mom.bean.EquipSparePartMasterData;
import cc.comac.mom.bean.EquipSparePartMasterDataBean;
import cc.comac.mom.bean.ResultDev;
import cc.comac.mom.dao.entity.EquipInWarehouseSpareRelationDao;
import cc.comac.mom.dao.entity.EquipSpareInWarehouseDao;
import cc.comac.mom.dao.entity.EquipSparePartMasterDataDao;
import cc.comac.mom.dao.entity.EquipSparePartsDueDao;
import cc.comac.mom.entity.EquipInWarehouseSpareRelationEntity;
import cc.comac.mom.entity.EquipSpareInWarehouseEntity;
import cc.comac.mom.entity.EquipSparePartMasterDataEntity;
import cc.comac.mom.entity.EquipSparePartsDueEntity;
import cc.comac.mom.entity.EquipWarehouseStockEntity;
import cc.comac.mom.util.BaseEntityDataUtil;
import cc.comac.mom.util.ResultBean;

@Component
@Transactional
public class EquipSparePartMasterDataDataHandler
		extends ServiceImpl<EquipSparePartMasterDataDao, EquipSparePartMasterDataEntity> {

	@Autowired
	private EquipSparePartMasterDataDao equipSparePartMasterDataDao;

	@Autowired
	private BaseEntityDataUtil baseEntityDataUtil;

	@Autowired
	private EquipWarehouseStockDataHandler equipWarehouseStockDataHandler;
	
	@Autowired
	private EquipInWarehouseSpareRelationDao equipInWarehouseSpareRelationDao;
	
	@Autowired
	private EquipSpareInWarehouseDao equipSpareInWarehouseDao;
	
	@Autowired
	private EquipSparePartsDueDao equipSparePartsDueDao;
	

	public ResultBean insertSaprePartMasterData(EquipSparePartMasterData equipSparePartMasterData) {
		ResultBean resultBean = new ResultBean(true);
		EquipSparePartMasterDataEntity sparePart = equipSparePartMasterData.getInnerData();
		if (StringUtils.isEmpty(sparePart.getSparePartNumber())) {
			throw new RuntimeException("备品备件编码不存在，我发新增！");
		}
		if (StringUtils.isEmpty(sparePart.getSparePartName())) {
			throw new RuntimeException("备品备件名称不存在，无法新增！");
		}

		QueryWrapper<EquipSparePartMasterDataEntity> queryWrapper = new QueryWrapper<EquipSparePartMasterDataEntity>();
		queryWrapper.eq("spare_part_number", sparePart.getSparePartNumber());
		queryWrapper.eq("row_status", 1);
		List<EquipSparePartMasterDataEntity> selectList = equipSparePartMasterDataDao.selectList(queryWrapper);
		if (selectList.size() > 0) {
			throw new RuntimeException("备品备件编码已存在，无法新增");
		}

		baseEntityDataUtil.setBaseEntityData(sparePart);
		int insert = equipSparePartMasterDataDao.insert(sparePart);
		if (insert != 1) {
			throw new RuntimeException("新增失败，新增数量为" + insert);
		}
		return resultBean;
	}

	public ResultBean updateSparePart(EquipSparePartMasterData equipSparePartMasterData) {
		ResultBean resultBean = new ResultBean(true);
		EquipSparePartMasterDataEntity innerData = equipSparePartMasterData.getInnerData();
		if (innerData.getId() == 0) {
			throw new RuntimeException("当前未选择数据！,id为0");
		}
		if (StringUtils.isNotEmpty(innerData.getSparePartNumber())) {
			QueryWrapper<EquipSparePartMasterDataEntity> queryWrapper = new QueryWrapper<EquipSparePartMasterDataEntity>();
			queryWrapper.eq("spare_part_number", innerData.getSparePartNumber());
			queryWrapper.eq("row_status", 1);
			queryWrapper.ne("spare_part_id", innerData.getId());
			List<EquipSparePartMasterDataEntity> selectList = equipSparePartMasterDataDao.selectList(queryWrapper);
			if (selectList.size() > 0) {
				throw new RuntimeException("备品备件编码" + innerData.getSparePartNumber() + "已存在，编辑失败");
			}
		}
		baseEntityDataUtil.updateBaseEntityData(innerData);
		int updateById = equipSparePartMasterDataDao.updateById(innerData);
		if (updateById != 1) {
			throw new RuntimeException("编辑失败，更新数量为" + updateById);
		}
		resultBean.setObject(updateById);
		return resultBean;
	}

	public ResultBean batchDelete(List<EquipSparePartMasterData> list) {
		ResultBean resultBean = new ResultBean(true);

		// 预留删除校验
		//是否被备件入库引用
		for (EquipSparePartMasterData equipSparePartMasterData : list) {
			// 查询备件数据
			EquipSparePartMasterDataEntity selectById = equipSparePartMasterDataDao.selectById(equipSparePartMasterData.getInnerData().getId());
			// 查询对应的备件是否在备件入库时被引用
			QueryWrapper<EquipInWarehouseSpareRelationEntity> queryWrapper = new QueryWrapper<EquipInWarehouseSpareRelationEntity>();
			queryWrapper.eq("row_status", 1);
			queryWrapper.eq("spare_part_id", selectById.getId());
			List<EquipInWarehouseSpareRelationEntity> selectList = equipInWarehouseSpareRelationDao.selectList(queryWrapper);
			if (selectList.size() > 0) {
				String inWarehouseNum = "/";
				for (EquipInWarehouseSpareRelationEntity equipInWarehouseSpareRelationEntity : selectList) {
					EquipSpareInWarehouseEntity selectById2 = equipSpareInWarehouseDao.selectById(equipInWarehouseSpareRelationEntity.getInWarehouseId());
					inWarehouseNum = inWarehouseNum + selectById2.getInWarehouseNumber()+"/";
				}
				throw new RuntimeException("备件"+selectById.getSparePartName()+"被入库单"+inWarehouseNum+"引用，无法删除！");
			}
			
			// 查询备件是否被到期查询界面引用
			QueryWrapper<EquipSparePartsDueEntity> queryWrapper2 = new QueryWrapper<EquipSparePartsDueEntity>();
			queryWrapper.eq("row_status", 1);
			queryWrapper.eq("part_number", selectById.getSparePartNumber());
			List<EquipSparePartsDueEntity> selectList2 = equipSparePartsDueDao.selectList(queryWrapper2);
			if (selectList2.size() > 0) {
				String workNumbers = "/";
				for (EquipSparePartsDueEntity equipSparePartsDueEntity : selectList2) {
					workNumbers = workNumbers+equipSparePartsDueEntity.getWorkNumber()+"/";
				}
				throw new RuntimeException("备件"+selectById.getSparePartName()+ "被备件到期信息界面"+workNumbers+"引用，无法删除！");
			}
		}
		
		// ...........

		List<EquipSparePartMasterDataEntity> list1 = new ArrayList<>();
		for (EquipSparePartMasterData equipSparePartMasterData : list) {
			EquipSparePartMasterDataEntity innerData = equipSparePartMasterData.getInnerData();
			EquipSparePartMasterDataEntity equipSparePartMasterDataEntity = new EquipSparePartMasterDataEntity();
			equipSparePartMasterDataEntity.setId(innerData.getId());
			equipSparePartMasterDataEntity.setRowStatus(0);
			baseEntityDataUtil.updateBaseEntityData(equipSparePartMasterDataEntity);
			list1.add(equipSparePartMasterDataEntity);
		}
		boolean updateBatchById = updateBatchById(list1, list1.size());
		if (!updateBatchById) {
			throw new RuntimeException("删除失败！");
		}
		return resultBean;
	}

	public ResultDev selectBysomeField(EquipSparePartMasterData equipSparePartMasterData) {
		ResultDev resultDev = new ResultDev();
		if (equipSparePartMasterData.getPageNum() == 0) {
			equipSparePartMasterData.setPageNum(1);
		}
		if (equipSparePartMasterData.getPageSize() == 0) {
			equipSparePartMasterData.setPageSize(10);
		}
		QueryWrapper<EquipSparePartMasterDataEntity> queryWrapper = new QueryWrapper<EquipSparePartMasterDataEntity>();
		queryWrapper.eq("row_status", 1);
		queryWrapper.orderByDesc("creation_time");
		EquipSparePartMasterDataEntity innerData = equipSparePartMasterData.getInnerData();
		if (StringUtils.isNotEmpty(innerData.getSparePartNumber())) {
			queryWrapper.like("spare_part_number", innerData.getSparePartNumber());
		}
		if (StringUtils.isNotEmpty(innerData.getSparePartName())) {
			queryWrapper.like("spare_part_name", innerData.getSparePartName());
		}
		if (StringUtils.isNotEmpty(innerData.getSparePartModel())) {
			queryWrapper.like("spare_part_model", innerData.getSparePartModel());
		}
		if (StringUtils.isNotEmpty(innerData.getSparePartType())) {
			queryWrapper.like("spare_part_type", innerData.getSparePartType());
		}
		Page<EquipSparePartMasterDataEntity> page = new Page<EquipSparePartMasterDataEntity>(
				equipSparePartMasterData.getPageNum(), equipSparePartMasterData.getPageSize(), true);
		IPage<EquipSparePartMasterDataEntity> selectPage = equipSparePartMasterDataDao.selectPage(page, queryWrapper);
		resultDev.setEntityList(selectPage.getRecords());
		resultDev.setPageCount((int)selectPage.getPages());
		resultDev.setTotalQuantity((int)selectPage.getTotal());
		return resultDev;
	}

	public boolean updateCountById(long id, double number) {
		EquipSparePartMasterDataEntity selectById = equipSparePartMasterDataDao.selectById(id);
		if (selectById == null) {
			throw new RuntimeException("通过备品备件主键" + id + "查询不到数据");
		}
		selectById.setTotalAmount(selectById.getTotalAmount() + number);
		int updateById = equipSparePartMasterDataDao.updateById(selectById);
		return updateById == 1 ? true : false;
	}

	public boolean batchUpdateCountById(List<EquipSparePartMasterDataEntity> list) {
		boolean saveBatch = false;
		if (list.size() > 0) {
			List<EquipSparePartMasterDataEntity> list1 = new ArrayList<EquipSparePartMasterDataEntity>();
			for (EquipSparePartMasterDataEntity equipSparePartMasterDataEntity : list) {
				if (equipSparePartMasterDataEntity.getId() == 0) {
					throw new RuntimeException("无法获取备件数据");
				}
				if (equipSparePartMasterDataEntity.getTotalAmount() == 0) {
					throw new RuntimeException("新增数量不可为0");
				}
				EquipSparePartMasterDataEntity selectById = equipSparePartMasterDataDao
						.selectById(equipSparePartMasterDataEntity.getId());
				if (selectById == null) {
					throw new RuntimeException("通过备品备件主键" + equipSparePartMasterDataEntity.getId() + "查询不到数据");
				}
				EquipSparePartMasterDataEntity selectById2 = equipSparePartMasterDataDao
						.selectById(equipSparePartMasterDataEntity.getId());
				selectById2
						.setTotalAmount(selectById.getTotalAmount() + equipSparePartMasterDataEntity.getTotalAmount());
				baseEntityDataUtil.updateBaseEntityData(selectById2);
				list1.add(selectById2);
			}
			if (list1.size() > 0) {
				saveBatch = updateBatchById(list1, list1.size());
			}
		}
		return saveBatch;
	}

	public ResultBean selectBysparePartNumber(EquipSparePartMasterData equipSparePartMasterData) {
		ResultBean resultBean = new ResultBean(true);
		String sparePartNumber = equipSparePartMasterData.getSparePartNumber();
		if (StringUtils.isEmpty(sparePartNumber)) {
			throw new RuntimeException("请输入备件编码！");
		}
		QueryWrapper<EquipSparePartMasterDataEntity> queryWrapper = new QueryWrapper<EquipSparePartMasterDataEntity>();
		queryWrapper.eq("row_status", 1);
		queryWrapper.eq("spare_part_number", sparePartNumber);
		EquipSparePartMasterDataEntity selectOne = equipSparePartMasterDataDao.selectOne(queryWrapper);
		if (selectOne == null) {
			throw new RuntimeException("备件编码" + sparePartNumber + "查询不到备件数据！");
		}
		resultBean.setObject(selectOne);
		return resultBean;
	}

	public ResultDev selectByWarehouseName(EquipSparePartMasterData equipSparePartMasterData) {
		ResultDev resultDev = new ResultDev();
		if (StringUtils.isEmpty(equipSparePartMasterData.getWarehouseName())) {
			throw new RuntimeException("无法获取仓库名称");
		}
		// 通过仓库查询库存内所有备件主键
		List<EquipWarehouseStockEntity> selectSpareIdsByWarehouseName = equipWarehouseStockDataHandler
				.selectSpareIdsByWarehouseName(equipSparePartMasterData.getWarehouseName());
		if (selectSpareIdsByWarehouseName.size() > 0) {
			if (equipSparePartMasterData.getPageNum() == 0) {
				equipSparePartMasterData.setPageNum(1);
			}
			if (equipSparePartMasterData.getPageSize() == 0) {
				equipSparePartMasterData.setPageSize(10);
			}
			List<Long> spareIds = new ArrayList<Long>();
			selectSpareIdsByWarehouseName.forEach(item -> {
				spareIds.add(item.getSparePartId());
			});
			// 分页查询当前仓库下所有的备件
			QueryWrapper<EquipSparePartMasterDataEntity> queryWrapper = new QueryWrapper<EquipSparePartMasterDataEntity>();
			queryWrapper.eq("row_status", 1);
			queryWrapper.orderByDesc("creation_time");
			queryWrapper.in("spare_part_id", spareIds);
			Page<EquipSparePartMasterDataEntity> page = new Page<EquipSparePartMasterDataEntity>(
					equipSparePartMasterData.getPageNum(), equipSparePartMasterData.getPageSize(), true);
			IPage<EquipSparePartMasterDataEntity> selectPage = equipSparePartMasterDataDao.selectPage(page,
					queryWrapper);
			// 进行匹配备件对应库存中所在的位置
			List<EquipSparePartMasterDataEntity> records = selectPage.getRecords();
			ArrayList<EquipSparePartMasterDataBean> arrayList = new ArrayList<EquipSparePartMasterDataBean>();
			for (EquipSparePartMasterDataEntity equipSparePartMasterDataEntity : records) {
				for (EquipWarehouseStockEntity equipWarehouseStockEntity : selectSpareIdsByWarehouseName) {
					if (equipSparePartMasterDataEntity.getId() == equipWarehouseStockEntity.getSparePartId()) {
						EquipSparePartMasterDataBean equipSparePartMasterDatabean = new EquipSparePartMasterDataBean();
						equipSparePartMasterDatabean.setInnerData(equipSparePartMasterDataEntity);
						equipSparePartMasterDatabean.setLocation(equipWarehouseStockEntity.getLocation());
						arrayList.add(equipSparePartMasterDatabean);
						break;
					}
				}
			}
			// 数据封装
			resultDev.setEntityList(arrayList);
			resultDev.setPageCount((int)selectPage.getPages());
			resultDev.setTotalQuantity((int)selectPage.getTotal());
			return resultDev;
		}
		return resultDev;
	}

	public ResultBean selectByWarehouseNameAndSpareNumber(EquipSparePartMasterData equipSparePartMasterData) {
			ResultBean resultBean = new ResultBean(true);
		// 通过仓库查询库存内所有备件主键
		EquipWarehouseStockEntity selectByWarehouseNameAndSpareNumber = equipWarehouseStockDataHandler
				.selectByWarehouseNameAndSpareNumber(equipSparePartMasterData.getWarehouseName(),
						equipSparePartMasterData.getSparePartNumber());
		if (selectByWarehouseNameAndSpareNumber == null) {
			throw new RuntimeException("当前仓库下未查询到备件数据");
		}
		EquipSparePartMasterDataEntity selectById = equipSparePartMasterDataDao.selectById(selectByWarehouseNameAndSpareNumber.getSparePartId());
		EquipSparePartMasterDataBean equipSparePartMasterDataBean = new EquipSparePartMasterDataBean();
		equipSparePartMasterDataBean.setInnerData(selectById);
		equipSparePartMasterDataBean.setLocation(selectByWarehouseNameAndSpareNumber.getLocation());
		resultBean.setObject(equipSparePartMasterDataBean);
		return resultBean;
	}
	
	public ResultDev selectAll () {
		ResultDev resultDev = new ResultDev();
		QueryWrapper<EquipSparePartMasterDataEntity> queryWrapper = new QueryWrapper<EquipSparePartMasterDataEntity>();
		queryWrapper.eq("row_status", 1);
		List<EquipSparePartMasterDataEntity> selectList = equipSparePartMasterDataDao.selectList(queryWrapper);
		resultDev.setEntityList(selectList);
		return resultDev;
	}
	
	public EquipSparePartMasterDataEntity selectPartMasterDataById(long id) {
		EquipSparePartMasterDataEntity selectById = equipSparePartMasterDataDao.selectById(id);
		return selectById;
	}
	//导入数据
	public ResultBean importBatch(List<EquipSparePartMasterDataEntity> list) {
		ResultBean resultBean = new ResultBean(true);
		if (list == null || list.size() < 1) {
			resultBean.setSuccess(false);
			resultBean.setMessage("导入数据为空");
			return resultBean;
		}
		for (EquipSparePartMasterDataEntity item : list) {
			baseEntityDataUtil.setBaseEntityData(item);
		}
		boolean saveBatch = this.saveBatch(list);
		if (!saveBatch) {
			throw new RuntimeException("导入失败");
		}
		resultBean.setMessage("成功导入:" + list.size() + "条数据");
		return resultBean;
	}
	
	public List<EquipSparePartMasterDataEntity> exportSelectByCondition(EquipSparePartMasterData obj) {
		QueryWrapper<EquipSparePartMasterDataEntity> queryWrapper = new QueryWrapper<EquipSparePartMasterDataEntity>();
		queryWrapper.eq("row_status", 1);
		if (obj != null && obj.getInnerData() != null) {
			if (obj.getInnerData().getSparePartNumber() != null && !"".equals(obj.getInnerData().getSparePartNumber())) {
				queryWrapper.like("spare_part_number", obj.getInnerData().getSparePartNumber());
			}
			if (obj.getInnerData().getSparePartName()!= null && !"".equals(obj.getInnerData().getSparePartName())) {
				queryWrapper.like("spare_part_name", obj.getInnerData().getSparePartName());
			}
			if (obj.getInnerData().getSparePartModel()!= null && !"".equals(obj.getInnerData().getSparePartModel())) {
				queryWrapper.like("spare_part_model", obj.getInnerData().getSparePartModel());
			}
			if (obj.getInnerData().getSparePartType()!= null && !"".equals(obj.getInnerData().getSparePartType())) {
				queryWrapper.like("spare_part_type", obj.getInnerData().getSparePartType());
			}			
		}
		List<EquipSparePartMasterDataEntity> list = equipSparePartMasterDataDao.selectList(queryWrapper);
		return list;

	}
}
